package 设计模式.命令模式.demo;

/**
 * 命令模式【Command Pattern】,是对命令的封装。每一个命令都是一个操作：请求的一方发出请求要求执行一个操作;接收
 * 的一方收到请求，并执行操作。命令模式解耦了请求方和接收方，请求方只需请求执行命令，不用关心命令是怎样被接收的，怎样
 * 被操作及是否被执行。。。等。
 *
 *命令模式在生活中的应用
 * 》遥控器
 * 》餐厅点菜单
 *
 *
 *命令模式的适用场景
 * 1.现实语义中具备“命令"的操作（如：命令菜单，sell命令。。。）
 * 2.请求调用者和请求接收者需要解耦，使得调用者和接收者不直接交互。
 * 3.需要抽象出等待执行的行为，比如：撤销（undo）操作和恢复【redo】等
 * 4.需要支持命令宏【即命令组合操作】
 *
 * 优点：
 * 　　1.通过引入中间件【抽象接口】，解耦命令请求与处理。
 * 　　2.扩展性良好，方便添加新的命令
 * 　　3.支持组合命令，支持命令队列。
 * 　　4.可以在现有命令的基础上，增加额外功能（如：日志记录，结合装饰器模式进行代码优化）
 *
 * 缺点：
 * 　　1.具体命令类有很多
 * 　　2.增加了程序复杂性，理解更加困难。
 *
 */
public class InvokerModel {
    public static void main(String[] args) {
        ICommand command = new ConcreteCommand();
        //命令发出方，需要传送命令
        Invoker invoker = new Invoker(command);
        invoker.action();
    }
}
